package com.ygy.jxc.service.Impl;

import cn.hutool.Hutool;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.github.pagehelper.PageHelper;
import com.ygy.jxc.dao.CkDepositoryDao;
import com.ygy.jxc.dao.CkDepositoryOutDao;
import com.ygy.jxc.dao.CkStockDao;
import com.ygy.jxc.dao.JxPurchaseExitDao;
import com.ygy.jxc.mapper.CkmdDepositoryMapper;
import com.ygy.jxc.mapper.CkmdDepositoryOutMapper;
import com.ygy.jxc.mapper.JxmdPurchaseExitMapper;
import com.ygy.jxc.model.*;
import com.ygy.jxc.service.CkDepositoryOutService;
import com.ygy.jxc.service.CkDepositoryService;
import com.ygy.jxc.service.CkStockService;
import com.ygy.jxc.util.UUidUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 入库清单 service
 */
@Service
public class CkDepositoryOutServiceImpl implements CkDepositoryOutService {

@Autowired
   private CkDepositoryOutDao CkDepositoryOutDao;
    @Autowired
    private CkmdDepositoryOutMapper depositoryOutMapper;

    @Autowired
     private CkStockDao stockDao; //库存

    @Autowired
    private CkDepositoryDao depositoryDao; //仓库

    @Autowired
    private JxmdPurchaseExitMapper purchaseExitMapper; //采购退货
    @Autowired
    private JxPurchaseExitDao purchaseExitDao; //自定义采购退货


    @Override
    public int create(CkmdDepositoryOut depositoryOut) {
        depositoryOut.setOutId(Long.valueOf(UUidUtils.uuid()));
        depositoryOut.setCreateDate(LocalDateTime.now());
        depositoryOut.setStatus(1); //默认出库
        /**
         * 计算
         （1）小数计算对精度无要求时，使用float节省时间。
         （2）如果有精度要求，用BigDecimal类处理（初始化必须使用字符串，因为用数值初始化会得到近似值，不准确），
         然后设置保留位数和 舍入法（half_up四舍五入，half_even银行家，half_down向下取整）
         */
        BigDecimal  priceTotal =null;
        BigDecimal shopPrice = depositoryOut.getShopPrice();  //商品单价
         Long shopNumber = depositoryOut.getShopNumber();    //商品数量
//        ShopPrice 是decimal   ShopNumber 是bigint
        if ( shopPrice !=null && shopNumber !=null){
            BigDecimal ShopNumber1 = new BigDecimal(shopNumber);
               priceTotal =ShopNumber1.multiply(shopPrice) ;  //商品数量乘商品价格
            depositoryOut.setTotalPrice(priceTotal);
        }

        return depositoryOutMapper.insert(depositoryOut);
    }

    @Override
    public int update( CkmdDepositoryOut depositoryOut) {
        BigDecimal  priceTotal =null;
        BigDecimal shopPrice = depositoryOut.getShopPrice();  //商品单价
        Long shopNumber = depositoryOut.getShopNumber();    //商品数量
//        ShopPrice 是decimal   ShopNumber 是bigint
        if ( shopPrice !=null && shopNumber !=null){
            BigDecimal ShopNumber1 = new BigDecimal(shopNumber);
            priceTotal =ShopNumber1.multiply(shopPrice) ;  //商品数量乘商品价格
            depositoryOut.setTotalPrice(priceTotal);
        }
        return depositoryOutMapper.updateByPrimaryKeySelective(depositoryOut);
    }

    @Override
    public int delete(Long id) {

        return depositoryOutMapper.deleteByPrimaryKey(id);
    }

    @Override
    public List  list() {
        return depositoryOutMapper.selectByExample(new CkmdDepositoryOutExample());
    }

    @Override
    public List<CkmdDepositoryOut> list(String keyword, Integer pageSize, Integer pageNum) {
        PageHelper.startPage(pageNum, pageSize);
        CkmdDepositoryOutExample example = new CkmdDepositoryOutExample();
        if (!StrUtil.isEmpty(keyword)) {
            example.createCriteria().andShopNameLike("%" + keyword + "%");
        }
        return depositoryOutMapper.selectByExample(example);
    }

    @Override
    public int addOrUpdateDepositoryOut(CkmdDepositoryOut depositoryOut) {
        // 判断 编号是否存在，如果存在就走更新的逻辑否则新增数据
        int res =0;
        if(depositoryOut.getId() != null && depositoryOut.getId() != 0){
            // 表示更新操作
            res =this.update(depositoryOut);
        }else{
            res =  this.create(depositoryOut);
        }
        return res;
    }


    /**
     * 商品 审核后出库
     * 0. 库存列表是否有充足的库存？ 无则返回  有则执行1
     * 1. 判断是否重复出库， 否 则执行2
     * 2. 出库 且 增加对应的仓库容量，及 减少对应的库存容量
     */
    @Override
    public int checkById(Long id) {
        int result =0;
        if (id ==null)  return result;
        CkmdDepositoryOut upDepositoryOut = new CkmdDepositoryOut();
        /**
         *  //通过id查询信息中是否出库这个字段 如果已经出库，就不需要更新出库时间了
         */

        CkmdDepositoryOut selectDepositoryOut = depositoryOutMapper.selectByPrimaryKey(id);  //原来的状态
        String shopName = selectDepositoryOut.getShopName();  //商品名
        String depositoryName = selectDepositoryOut.getDepository();  //获取仓库名
        Long shopNumber = selectDepositoryOut.getShopNumber();   //获取出库的数量
        Long sourceNumber = selectDepositoryOut.getSourceNumber(); //获取采购编号
        //======> 增加时 必须有 商品名 仓库名 出库数量
        /**
         * 是否有库存   库存的 ？  需要出库的
         */
        List<CkmdStock> stockList = stockDao.getStockByTwoName(shopName, depositoryName);
//        System.out.println("存在库存："+stockList.toString());
        CkmdStock  stockCheck = stockList.get(0);
        if (stockCheck !=null ){

        }
        //如果库存少于需要出库的 直接返回
        if (stockCheck.getQuantity() < shopNumber){  return result;  }

        if ( selectDepositoryOut.getStatus() == 1){  //原来还是未出库状态则设置 出库时间
            upDepositoryOut.setDate(LocalDateTime.now());
        }
        upDepositoryOut.setOutInspection(0);      //审核  状态
        upDepositoryOut.setStatus(0);            //出库   状态
        //更新的条件
        CkmdDepositoryOutExample  depositoryOutExample = new CkmdDepositoryOutExample();
        depositoryOutExample.createCriteria().andIdEqualTo(id);
         result = depositoryOutMapper.updateByExampleSelective(upDepositoryOut, depositoryOutExample);
            //进行中且 更新完成
        if ( selectDepositoryOut.getStatus() == 1  && result > 0 ){
            /**
             *   出库单更新成功后才能更新库存
             * 更新(减少)所对应的商品-仓库的容量(商品库存列表)
             */
//            int i1 = stockDao.updateQuantityByTwoName(shopNumber, shopName, depositoryName);
            /**
             * 仓库容量变化       //剩余量  >  总量  怎么办 ？
             */
            int i = depositoryDao.addArea(depositoryName, shopNumber);


            //先查询采购退货是否有采购编号
           List<JxmdPurchaseExit>  purchaseExitNumber =purchaseExitDao.selectNumber(sourceNumber);
            if ( !ObjectUtil.isEmpty(purchaseExitNumber.get(0) )) {  //空 true   ; 非空则执行
                /**
                 * 通过出库编号查询 源编号(采购编号)
                 *    查询是否有这个采购编号的信息
                 * 然后更新 采购退货中的信息
                 * 更新采购退货状态
                 */
                JxmdPurchaseExitExample purchaseExitExample = new JxmdPurchaseExitExample();
                purchaseExitExample.createCriteria().andNumberEqualTo(String.valueOf(sourceNumber)); //采购退货编号
                JxmdPurchaseExit  purchaseExit = new JxmdPurchaseExit();
                purchaseExit.setStatus(0);
                purchaseExit.setRemark("采购->入库->退购-->出库-->完成出库成功");   //工作流结合
                int i1 = purchaseExitMapper.updateByExampleSelective(purchaseExit, purchaseExitExample);
            }
        }


        return  result;
    }

    /**
     * 通过 编号 获取 出库清单
     * @param number   源 编号
     * @return
     */
    @Override
    public List<CkmdDepositoryOut> getRowInfoByPurchaseNumber(int number) {
        CkmdDepositoryOutExample depositoryOutExample = new CkmdDepositoryOutExample();
        depositoryOutExample.createCriteria().andSourceNumberEqualTo(Long.valueOf(number));
//        List<CkmdDepositoryOut>  DepositoryIns = depositoryOutMapper.selectByExample(depositoryOutExample);
        return depositoryOutMapper.selectByExample(depositoryOutExample);
    }




}
